package cn.com.seederland.gkrpc.server;

import cn.com.seederland.gkrpc.Request;
import cn.com.seederland.gkrpc.ServiceDescriptor;
import cn.com.seederland.gkrpc.common.utils.ReflectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

/**
 * @ClassName ServiceManager
 * @Author SighFate
 * @Date 2020/10/06 23:52
 * @Version 1.0
 * @Description 管理暴露的RPC服务
 */
public class ServiceManager {

    private static Logger LOGGER = LoggerFactory.getLogger(ServiceManager.class);

    /**
     * 所有服务的集合
     */
    private Map<ServiceDescriptor, ServiceInstance> servicesMap;

    /**
     * 初始化服务管理对象
     */
    public ServiceManager() {
        this.servicesMap = new ConcurrentHashMap<>();
    }

    /**
     * 注册需要管理的服务
     * @param interfaceClass 定义的服务接口对象
     * @param bean 对象的实现类
     * @param <T> 需要注册的对象类型
     */
    public <T> void register(Class<T> interfaceClass, T bean){
        LOGGER.info("开始注册服务...");
        Method[] methods = ReflectionUtils.getPublicMethods(interfaceClass);
        for (Method method : methods) {
            ServiceInstance serviceInstance = new ServiceInstance(bean, method);
            ServiceDescriptor serviceDescriptor = ServiceDescriptor.from(interfaceClass, method);
            servicesMap.put(serviceDescriptor, serviceInstance);
            LOGGER.info("正在注册服务：{}-{}", serviceDescriptor.getClazz(), serviceDescriptor.getMethod());
        }
        LOGGER.info("服务注册完成.");
    }

    /**
     * 根据请求查找服务
     * @param request 请求
     * @return 请求的目标的服务
     */
    public ServiceInstance lookup (Request request) {
        // 请求的服务的描述
        ServiceDescriptor serviceDescriptor = request.getServiceDescriptor();
        return servicesMap.get(serviceDescriptor);
    }


}
